/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Saison;
import com.rhf.core.dto.SaisonVO;

/**
 * @author fabiensaulnier
 * 
 */
public class SaisonImp extends Base implements Saison {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Saison#contructeur(java.sql.ResultSet)
	 */
	public SaisonVO contructeur(ResultSet rs) throws Exception {

		SaisonVO saisonVO = new SaisonVO();

		try {

			saisonVO.setSaisonId(rs.getInt("saison_id"));
			saisonVO.setDateCreation(rs.getTimestamp("date_creation"));
			saisonVO.setDateModification(rs.getTimestamp("date_modification"));
			saisonVO.setAuteurId(rs.getInt("auteur_id"));
			saisonVO.setLibelle(rs.getString("libelle"));
			saisonVO.setSaisonCourante(rs.getInt("saison_courante"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return saisonVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Saison#ajouterSaison(com.rhf.core.db.valuesobjects
	 * .SaisonVO)
	 */
	public int ajouterSaison(SaisonVO saisonVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "INSERT INTO saison ";
		query += "(date_creation, date_modification, auteur_id, libelle, saison_courante) ";
		query += "VALUES (now(), now(), ?, ?, ?)";

		try {
			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			int i = 1;
			stmt.setInt(i++, saisonVO.getAuteurId());
			stmt.setString(i++, saisonVO.getLibelle());
			stmt.setInt(i++, saisonVO.getSaisonCourante());

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Saison#modifierSaison(int)
	 */
	public int modifierSaison(SaisonVO saisonVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "UPDATE saison ";
		query += " SET date_modification = now(), auteur_id = ?,libelle = ?, saison_courante = ?) ";
		query += " WHERE saison_id = ?";

		try {

			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			int i = 1;
			stmt.setInt(i++, saisonVO.getAuteurId());
			stmt.setString(i++, saisonVO.getLibelle());
			stmt.setInt(i++, saisonVO.getSaisonCourante());
			stmt.setInt(i++, saisonVO.getSaisonId());

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Saison#recuperSaison(int)
	 */
	public SaisonVO recuperSaison(int saisonId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		SaisonVO saisonVO = null;

		// Requ�te SQL
		String query = "SELECT * ";
		query += "FROM saison";
		query += "WHERE saison_id = ?";

		try {

			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			stmt.setInt(1, saisonId);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des donn�es
			if (rs.next()) {
				saisonVO = this.contructeur(rs);
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return saisonVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Saison#recupererListeSaison()
	 */
	public List<SaisonVO> recupererListeSaison() throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<SaisonVO> list = null;

		// Requ�te SQL
		String query = "SELECT * FROM saison ORDER BY libelle";

		try {

			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des donn�es
			if (rs.next()) {
				list = new ArrayList<SaisonVO>();
				list.add(this.contructeur(rs));
				while (rs.next()) {
					list.add(this.contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Saison#supprimerSaison(int)
	 */
	public int supprimerSaison(int saisonId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requ�te SQL
		String query = "DELETE FROM saison ";
		query += "WHERE saison_id = ? ";

		try {

			// Connexion � la base de donn�es
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// D�finition des param�tres (?)
			stmt.setInt(1, saisonId);

			// Ex�cution de la requ�te
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
